package com.example.work.controller;

import com.example.work.entity.DbCheckCategory;
import com.example.work.entity.DbUser;
import com.example.work.entity.TbCheckArea;
import com.example.work.entity.TbCheckAreaItem;
import com.example.work.service.IAreaService;
import com.example.work.service.ICategoryService;
import com.example.work.utils.R;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.work.utils.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author: javaLiuwb
 * @date: 2024-11-25 19:30
 * @description: Controller for managing areas with pagination support.
 */
@RestController
@RequestMapping("/area")
public class AreaController {
    @Autowired
    private ICategoryService categoryService;

    @Autowired
    private IAreaService areaService;

    @GetMapping("/all_list")
    public R allList(){
        Map<String,Object> map = new HashMap<>();
        List<DbCheckCategory> list = categoryService.list();
        for (DbCheckCategory dbCheckCategory : list) {
            List<Map<String, Object>> areaItemsById = areaService.getCategoryAreas(dbCheckCategory.getId())
                    .stream()
                    .map(area -> {
                        Map<String, Object> areaMap = new HashMap<>();
                        areaMap.put("id", area.getId());
                        areaMap.put("name", area.getName());
                        areaMap.put("category_id",dbCheckCategory.getId());
                        return areaMap;
                    })
                    .collect(Collectors.toList());
            map.put(dbCheckCategory.getName(),areaItemsById);
        }
        return R.ok(map);
    }
    @GetMapping("/getAllArea")
    public R getCategories() {
        // 调用 Service 获取数据
        Map<String, Object> map = new HashMap<>();
        return R.ok().data(areaService.getActiveAreas());
    }
    @GetMapping("/list")
    public R list(@RequestParam(value = "current", defaultValue = "1") int page,
                  @RequestParam(value = "size", defaultValue = "10") int size) {
        try {
            // 分页查询区域列表
            IPage<TbCheckArea> areaPage = areaService.page(new Page<>(page, size));

            // 组装分页结果
            Map<String, Object> map = new HashMap<>();
            map.put("records", areaPage.getRecords()); // 当前页数据
            map.put("total", areaPage.getTotal()); // 总记录数
            map.put("pages", areaPage.getPages()); // 总页数
            map.put("current", areaPage.getCurrent()); // 当前页码
            map.put("size", areaPage.getSize()); // 每页大小

            return R.ok(map);
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("获取列表失败：" + e.getMessage());
        }
    }

    /**
     * 保存或更新区域信息
     *
     * @param tbCheckArea 区域数据
     * @return 操作结果
     */
    @PutMapping("/save")
    public R save(@RequestHeader("Authorization") String authorizationHeader,@RequestBody TbCheckArea tbCheckArea) {
        String userName = TokenUtils.getUserNameFromToken(authorizationHeader);
        try {
            if (tbCheckArea == null) {
                return R.error("提交的数据不能为空！");
            }

            Date date = new Date();
            if (tbCheckArea.getId() == null) {
                // 设置创建时间和更新时间
                tbCheckArea.setCreateTime(date);
                tbCheckArea.setUpdateTime(date);
                tbCheckArea.setCreateBy(userName);
                areaService.save(tbCheckArea);
            } else {
                // 设置更新时间
                tbCheckArea.setUpdateTime(date);
                areaService.saveOrUpdate(tbCheckArea);
            }
            return R.ok();
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("保存失败：" + e.getMessage());
        }
    }

    /**
     * 删除指定的区域信息
     *
     * @param id 区域的 ID
     * @return 删除结果
     */
    @PutMapping("/delete/{id}")
    public R delete(@PathVariable(value = "id") String id) {
        try {
            if (id == null || id.isEmpty()) {
                return R.error("ID 不能为空！");
            }

            areaService.removeById(id);
            return R.ok();
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("删除失败：" + e.getMessage());
        }
    }
    @PutMapping("/update/{id}")
    public R updateAreaById(
            @PathVariable("id") String id, // 使用 @PathVariable 动态路径参数
            @RequestBody TbCheckArea tbCheckArea // 使用 @RequestBody 接收 JSON 数据
    )
    {
        // 打印接收到的 ID
        System.out.println("接收到的area ID：" + id);
        // 检查路径中的 Id 是否为空
        if (id == null || id.isEmpty()) {
            return R.error("area ID 不能为空");
        }
        // 检查请求体中的数据是否完整
        if (tbCheckArea == null) {
            return R.error("请求体不能为空");
        }
        // 设置 tbCheckArea 对象的 id（确保请求体中的 id 与路径参数一致）
        tbCheckArea.setId(id);
        // 调用服务层更新方法
        boolean isUpdated = areaService.updateAreaById(tbCheckArea);
        // 返回操作结果
        if (isUpdated) {
            return R.ok("修改成功");
        } else {
            return R.error("修改失败");
        }
    }
}